// 操作方法
/**
 * concat 
 * 1.可以基于当前数组中的所有项创建一个新数组
 * 2.不传参数的情况下，只是复制当前数组并返回副本 看似是一种深拷贝，原数组不受影响，但是当数组中
 * 包含其他引用类型的时候，就不是深拷贝了。总结起来，concat不是深拷贝
 * 3.如果传递了一个或者多个数组,则该方法会将这些数组中的每一项都添加到结果数组中
 * 4.如果传递的不是数组，这些值会被简单的添加到结果数组的末尾
 * 
 */
var colors = ['red', 'green', 'blue']
var colors2 = colors.concat('yellow', ['black', 'brown'])
console.log('colors', colors) // ["red", "green", "blue"] 原数组未改变
console.log('colors2', colors2) // ["red", "green", "blue", "yellow", "black", "brown"]
var colors3 = colors.concat() // 复制了一个数组
colors3[0] = 'gray' // 改的是复制的数组
console.log('colors3', colors3) // ["gray", "green", "blue"]
console.log('colors', colors) // ["red", "green", "blue"] 原数组未改变

// 复制了一个数组的引用 
var colors4 = colors
colors4[0] = 'gray'
console.log('colors4', colors4) // ["gray", "green", "blue"]
console.log('colors', colors) // ["gray", "green", "blue"]原数组改变了


// 利用这个特性可以进行多个数组的展开合并
var colors5 = colors.concat(['yellow'], ['black', 'brown'], [1, 2, 3, 4])
// ["gray", "green", "blue", "yellow", "black", "brown", 1, 2, 3, 4]
console.log('colors5', colors5)

// 推翻之前concat是深拷贝的结论
var deepReady = [{name: 'lee'}, {name: 'hh'}]
var copy = deepReady.concat()
// 0: {name: "lee"}
// 1: {name: "hh"}
console.log('deepReady', deepReady)
// 0: {name: "lee"}
// 1: {name: "hh"}
console.log('copy', copy)
// 改变数组中引用类型的属性
copy[0].name = 'can'
// 0: {name: "can"}
// 1: {name: "hh"} 原数组发生了改变，说名concat是一种浅拷贝
console.log('deepReady', deepReady)
// 0: {name: "can"}
// 1: {name: "hh"}
console.log('copy', copy)